/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.medical.util;

import com.ec.medical.entidades.Cita;
import com.ec.medical.enumeracion.EstadoCitaEnum;
import com.ec.medical.enumeracion.StyleClassCitasAgendadasEnum;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import org.primefaces.model.DefaultScheduleEvent;
import org.primefaces.model.ScheduleEvent;
import org.primefaces.model.ScheduleModel;

/**
 *
 * @author Administrador
 */
public abstract class GenerarCitas {

    protected Date fechaDesde;
    protected Date fechaActual;
    protected List<ScheduleEvent> eventos;
    protected List<EstadoCitaEnum> estadosCitas;
    

    public GenerarCitas() {
        fechaActual = Utilitarios.obtenerFechaSinHoras(new Date());
        estadosCitas = new ArrayList<EstadoCitaEnum>();
        estadosCitas.add(EstadoCitaEnum.ACT);
        estadosCitas.add(EstadoCitaEnum.ATE);
        estadosCitas.add(EstadoCitaEnum.CAN);
        estadosCitas.add(EstadoCitaEnum.NAT);
    }

    protected abstract ScheduleModel generarCitasTodosEstados();

    protected abstract ScheduleModel generarCitasSoloActivas();

    /*
     * genera la entidad ScheduleEvent con los datos de la cita
     */
    protected ScheduleEvent generar(Cita cita) {

        //Date fechaMasDuracion = fechaMasDuracion(fechaInicio);

        String label = Utilitarios.obtenerFechaFormateada(cita.getHoraInicio(), Utilitarios.HH_MM) + " a " + Utilitarios.obtenerFechaFormateada(cita.getHoraFin(), Utilitarios.HH_MM);
        DefaultScheduleEvent evento = new DefaultScheduleEvent(label, cita.getFechaCita(), fechaMasDuracion(cita.getFechaCita(), cita.getHoraInicio(), cita.getHoraFin()), cita.getCodigoCita());

        evento.setEditable(true);
        evento.setId(cita.getCodigoCita().toString());
        Date fechaInicioSinHoras = Utilitarios.obtenerFechaSinHoras(cita.getFechaCita());

        if (fechaInicioSinHoras.after(fechaActual)) {
            evento.setStyleClass(StyleClassCitasAgendadasEnum.CITA_POSTERIOR.getClase());
        } else if (fechaInicioSinHoras.before(fechaActual) && cita.getEstado().equals(EstadoCitaEnum.ACT)) {
            evento.setStyleClass(StyleClassCitasAgendadasEnum.CITA_ANTERIOR_ACTIVA.getClase());
        } else if (fechaInicioSinHoras.before(fechaActual) && cita.getEstado().equals(EstadoCitaEnum.ATE)) {
            evento.setStyleClass(StyleClassCitasAgendadasEnum.CITA_ANTERIOR_ATENDIDA.getClase());
        } else if (fechaInicioSinHoras.before(fechaActual) && cita.getEstado().equals(EstadoCitaEnum.CAN)) {
            evento.setStyleClass(StyleClassCitasAgendadasEnum.CITA_ANTERIOR_CANCELADA.getClase());
        } else if (fechaInicioSinHoras.before(fechaActual) && cita.getEstado().equals(EstadoCitaEnum.NAT)) {
            evento.setStyleClass(StyleClassCitasAgendadasEnum.CITA_ANTERIOR_NO_ATENDIDA.getClase());
        } else if (fechaInicioSinHoras.equals(fechaActual) && cita.getEstado().equals(EstadoCitaEnum.ACT)) {
            evento.setStyleClass(StyleClassCitasAgendadasEnum.CITA_ACTUAL_ACTIVA.getClase());
        } else if (fechaInicioSinHoras.equals(fechaActual) && cita.getEstado().equals(EstadoCitaEnum.ATE)) {
            evento.setStyleClass(StyleClassCitasAgendadasEnum.CITA_ACTUAL_ATENDIDA.getClase());
        } else if (fechaInicioSinHoras.equals(fechaActual) && cita.getEstado().equals(EstadoCitaEnum.CAN)) {
            evento.setStyleClass(StyleClassCitasAgendadasEnum.CITA_ACTUAL_CANCELADA.getClase());
        } else if (fechaInicioSinHoras.equals(fechaActual) && cita.getEstado().equals(EstadoCitaEnum.NAT)) {
            evento.setStyleClass(StyleClassCitasAgendadasEnum.CITA_ACTUAL_CANCELADA.getClase());
        }
        return evento;
    }

    private Date fechaMasDuracion(Date fecha, Date horaInicio, Date horaFin) {
        int duracionHoras = Utilitarios.obtenerHoraAmPm(horaFin) - Utilitarios.obtenerHoraAmPm(horaInicio);
        int duracionMinutos = Utilitarios.obtenerMinutos(horaFin) - Utilitarios.obtenerMinutos(horaInicio);
        Calendar cal = Calendar.getInstance();
        cal.setTime(fecha);
        cal.add(Calendar.HOUR, duracionHoras);
        cal.add(Calendar.MINUTE, duracionMinutos);
        return cal.getTime();
    }

    public static ScheduleModel generarCitasActivas(GenerarCitas generar) {
        return generar.generarCitasSoloActivas();
    }

    public static ScheduleModel generarCitasTodosEstados(GenerarCitas generar) {
        return generar.generarCitasTodosEstados();
    }

    
}
